package szoftlab4sunak;

import java.util.ArrayList;
import java.util.Random;

public class Human implements Enemy {
	
	Cell currentCell; // az akualis Cell, amin all.
	Init init; // a globalis Init osztaly.
	private int id; //azonosito
	int hp; //eletero
	int speed; //sebesseg
	int ttm; //mikor lephet
	int tempttm; //aktualis cellarol mikor lephet
	Cell previousCell; //elozo cella
	ArrayList<String> op; //fajlba irast segito string tomb
	private int x; // az enemy x koordinataja, rajzolashoz szukseges
	private int y; // az enemy y koordinataja, rajzolashoz szukseges
	private VHuman vHuman; // referencia a rajzolast vegzo objektumra
	
	public Human() {
		
	}
	// az x koordinata erteke
	public int getPosx(){
		return x;
	}
	// az y koordinata erteke
	public int getPosy(){
		return y;
	}
	
	// Konstruktor
	public Human(int id, Cell cell, Init init, ArrayList<String> op) {
		// Megfelelo parameterek beallitasa
		this.op=op;
		this.id = id;
		currentCell = cell;
		previousCell = null;
		this.init = init;
		// tesztelesi celbol hasznalt fuggvenyhivas
		op.add("CE - " + id + " id-val " + currentCell.getID() + " id-u Cell-en letrejott egy HO tipusu Enemy.");
		// tovabbi parameterek megadasa
		ttm = 1;
		tempttm = 1;
		this.x = cell.getPosX();
		this.y = cell.getPosY();
		vHuman = new VHuman();
		vHuman.setEnemy(this);
		init.vmap.vEnemyStore.put(this.id, vHuman);		
	}
    
	// Eletero lekerese
	public int getHP() {
		return hp;
	}
	    
	// Tick esemenyre reagalas.
	public void Tick() {
		// mehet-e az ellenfel
		if(canIgo()) {
			Cell[] cells = currentCell.getNeighbours();
			// merre mennyen tovabb
			while(true) {
				// random utvonalvalasztashoz szukseges random szam konstrualasa
				Random random = new Random();
				int i = random.nextInt(8);
				// ha vannak szomszedai
				if(cells[i] != null) {
					// ha tudunk lepni
					if(cells[i].isRoad() && cells[i].getID()!=0 && cells[i] != previousCell) {
						// lepes, es az ezzel jaro parameterek beallitasa
						currentCell.moveFrom(this);
						cells[i].moveTo(id, this);
						previousCell = currentCell;
						currentCell = cells[i];
						this.x = currentCell.getPosX();
						this.y = currentCell.getPosY();
						init.vmap.repaint();
						// ha cel cella, vege a jateknak, nyert az Enemy
						if(cells[i].isLastCell())
							init.endGame2();
						return;
					}
				}
			}
		}
		init.vmap.repaint();
	}
	
	// Ha egy Tower meglovi, ezt a metodust hivja meg.
    public void Shoot(Tower t){
    	t.Damage();
    }

    // Ha egy Tower meglovi, ezzel a metoddusal csokkenti az eletet.
    public void Decrease(int amount){
    	// eletero csokkentese
    	hp -= amount;
    	// ha meghalt az adott enemy
    	if(hp <= 0) {
    		init.map.Update();
    		currentCell.enemies.remove(this.id);
    		init.map.enemyStore.remove(this.id);
    		init.vmap.vEnemyStore.remove(this.id);
    	}
    	System.out.println("Eletem: " + this.hp);
    }
    
    // A rajta levo Trap-bol ki tudja szamolni, hogy mehet-e mar tovabb.
    public boolean canIgo() {
    	if(currentCell.getID() != 0) {
		   	if(tempttm == 1) {
		   		tempttm = ttm;
		   		return true;
		   	}
		   	else {
		   		tempttm--;
		   		return false;
		   	}
	   }
	   else {
		   if(speed == 0)
			   return true;
		   else {
			   speed--;
		   }
	   }
	   return false;
   }

    // beallitja a parametereit, megadottak alapjan
 	public void setParams(int hp, int speed, int ttm) {
 		this.hp = hp;
 		this.speed = speed;
 		this.ttm = ttm;
 		this.tempttm = ttm;
 	}

 	// az ellenfel ketteeseset valositja meg
 	public void cutYourSelf() {
 		// a "klon" letrehozasa
 		int ID = init.getCutID();
 		Human h1 = new Human(ID, currentCell, init, op);
 		// parametereinek beallitasa
 		int newhp = this.hp/2;
 		setParams(newhp, speed, tempttm);
 		h1.setParams(newhp, this.speed, this.tempttm);
 		// tarolas
 		init.map.enemyStore.put(ID, h1);
 		currentCell.moveTo(ID, h1);
 	}

 	// trap-re lepeskor varakozasi ido megnovelese
 	public void waitTime(int amount) {
 		tempttm += amount;
 	}

 	// ellenfel cellajanak visszaadasa
 	public int getPosition() {
 		return currentCell.getID();
 	}
 	
 // visszaadja az Enemy ID-at
 	public int getID() {
 		return this.id;
 	}
    
}
